using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes.DomainAttributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Enums;
using System.Collections.Generic;
using System.ComponentModel;

namespace Baci.ArcGIS._3DAnalystTools._Visibility
{
    /// <summary>
    /// <para>Intervisibility</para>
    /// <para>Determines the visibility of sight lines using  potential obstructions defined by any combination of  3D features and surfaces.</para>
    /// <para>使用由 3D 要素和曲面的任意组合定义的潜在障碍物来确定视线的可见性。</para>
    /// </summary>    
    [DisplayName("Intervisibility")]
    public class Intervisibility : AbstractGPProcess
    {
        /// <summary>
        /// 无参构造
        /// </summary>
        public Intervisibility()
        {

        }

        /// <summary>
        /// 有参构造
        /// </summary>
        /// <param name="_sight_lines">
        /// <para>Sight Lines</para>
        /// <para>The 3D sight lines whose visibility will be evaluated.</para>
        /// <para>将评估其能见度的 3D 视线。</para>
        /// </param>
        /// <param name="_obstructions">
        /// <para>Obstructions</para>
        /// <para>The 3D features, integrated mesh scene layers, and surfaces that provide potential obstructions for the sight lines.</para>
        /// <para>3D 特征、集成的网格场景图层和为视线提供潜在障碍物的表面。</para>
        /// </param>
        public Intervisibility(object _sight_lines, List<object> _obstructions)
        {
            this._sight_lines = _sight_lines;
            this._obstructions = _obstructions;
        }
        public override string ToolboxName => "3D Analyst Tools";

        public override string ToolName => "Intervisibility";

        public override string CallName => "3d.Intervisibility";

        public override List<string> AcceptEnvironments => ["extent", "outputCoordinateSystem", "parallelProcessingFactor", "workspace"];

        public override object[] ParameterInfo => [_sight_lines, _obstructions, _visible_field, _out_feature_class];

        /// <summary>
        /// <para>Sight Lines</para>
        /// <para>The 3D sight lines whose visibility will be evaluated.</para>
        /// <para>将评估其能见度的 3D 视线。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Sight Lines")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _sight_lines { get; set; }


        /// <summary>
        /// <para>Obstructions</para>
        /// <para>The 3D features, integrated mesh scene layers, and surfaces that provide potential obstructions for the sight lines.</para>
        /// <para>3D 特征、集成的网格场景图层和为视线提供潜在障碍物的表面。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Obstructions")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public List<object> _obstructions { get; set; }


        /// <summary>
        /// <para>Visible Field Name</para>
        /// <para>The name of the field that will store the visibility results. A resulting value of 0 indicates that the sight line's start and end points are not visible to one another. A value of 1 indicates that the sight line's start and end points are visible to one another. The default field name is VISIBLE. If the field already exists, its values will be overwritten.</para>
        /// <para>将存储可见性结果的字段的名称。结果值为 0 表示视线的起点和终点彼此不可见。值为 1 表示视线的起点和终点彼此可见。默认字段名称为 VISIBLE。如果该字段已存在，则其值将被覆盖。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Visible Field Name")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _visible_field { get; set; } = null;


        /// <summary>
        /// <para>Output Feature Class</para>
        /// <para></para>
        /// <para></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Output Feature Class")]
        [Description("")]
        [Option(OptionTypeEnum.derived)]
        public object _out_feature_class { get; set; }


        public Intervisibility SetEnv(object extent = null, object outputCoordinateSystem = null, object parallelProcessingFactor = null, object workspace = null)
        {
            base.SetEnv(extent: extent, outputCoordinateSystem: outputCoordinateSystem, parallelProcessingFactor: parallelProcessingFactor, workspace: workspace);
            return this;
        }

    }

}